#ifndef EULER_OPERATORS_H
#define EULER_OPERATORS_H

#include "vector3d.h"
#include "face.h"
#include "edge.h"
#include "vertex.h"
#include "color.h"

class Object;

class EulerOperators{
    public:
        EulerOperators();
        ~EulerOperators(){};

        HalfEdge *addHE(Edge *, Vertex *, HalfEdge *, bool);
        HalfEdge *delHE(HalfEdge *);
        HalfEdge *findHE(Face *, Vertex *, Vertex *);
        HalfEdge *hePrev(HalfEdge *);

        void mvfs(Object *, const Vector3D &, const Color &);
//        void kvfs();

        void lmev(Object *, HalfEdge *, HalfEdge *, const Vector3D &, const Color &);
        void mev(Object *, Face *, Face *, Vertex *, Vertex *, Vertex *, const Vector3D &, const Color &);
        void mev(Object *, Face *, Vertex *, Vertex *, const Vector3D &, const Color &);
        void lkev(Object *, HalfEdge *, HalfEdge *);
        void kev(Object *, Face *, Vertex *, Vertex *);

        void lmef(Object *, HalfEdge *, HalfEdge *);
        void mef(Object *, Face *, Vertex *, Vertex *);
        void lkef(Object *, HalfEdge *);
        void kef(Object *, Face *, Vertex *, Vertex *);

        void lkemr(Object *, HalfEdge *);
        void kemr(Object *, Face *, Vertex *, Vertex *);

        void lkfmrh(Object *, Face *, Face *);
        void kfmrh(Object *, Face *, Face *);

        void lringmv(Loop *, Face *, bool);
        void ringmv(Face *, Face *, Vertex *, Vertex *, bool);
        void ringmv(Face *, Face *, Loop *, bool);


        void sweep(Face *, const Vector3D &);
        void sweepByLoop(Loop *, const Vector3D &, Object *);
        void rsweep(Object *, const Vector3D &, int, const Vector3D &);
        void rsweepByLoop(Loop *, const Vector3D &, int, const Vector3D &, Object *);

    private:
        unsigned int idFace;
        unsigned int idLoop;
        unsigned int idEdge;
        unsigned int idHalfEdge;
        unsigned int idVertex;
};

#endif
